#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QDebug>

int flg = 0;

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //定义一个字符串列表 m_serialPortName 用于存储串口名称。
    QStringList m_serialPortName;
    //遍历系统中所有可用的串口信息。
    foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
    {
        //将每个可用串口的名称添加到 m_serialPortName 列表中。
        m_serialPortName << info.portName();
        qDebug()<<"序列端口名称:"<<info.portName();
    }
    //初始化串口指针为 nullptr。
    m_serialPort = nullptr;
    //调用 slotOpenSerialPort 函数尝试打开串口。
    slotOpenSerialPort();
}
//slotLoadSerialPort 槽函数：会重新获取系统中可用串口列表并存储在 m_serialPortName 中，不同的是使用 qWarning() 输出信息。
void MainWindow::slotLoadSerialPort()
{
    QStringList m_serialPortName;
    foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts()) //获取有效的串口列表
    {
        m_serialPortName << info.portName();
        qWarning()<<"序列端口名称:"<<info.portName();
    }
}
//slotCloseSerialPort 槽函数：关闭串口，通过调用 m_serialPort->close() 方法来实现。
void MainWindow::slotCloseSerialPort()
{
    m_serialPort->close();
}

void MainWindow::slotOpenSerialPort()
{
    //创建一个新的 QSerialPort 对象并关联到当前窗口。
    m_serialPort = new QSerialPort(this);//新建一个窗口对象
    //检查串口是否已经打开，如果已打开，则先清除串口数据并关闭。
    if(m_serialPort->isOpen())
    {
        m_serialPort->clear();
        m_serialPort->close();
    }
    //设置串口名字
    m_serialPort->setPortName("COM3");
    //尝试以读写模式打开串口，如果打开失败则直接返回。
    if (!m_serialPort->open(QIODevice::ReadWrite))
    {
        return;
    }
    else
    {
        qDebug()<<"成功！";
    }
    //设置串口参数
    //设置波特率为 115200
    m_serialPort->setBaudRate(115200);
    //设置数据位为 8 位。
    m_serialPort->setDataBits(QSerialPort::Data8);
    //设置无数据流控制。
    m_serialPort->setFlowControl(QSerialPort::NoFlowControl);
    //设置无校验位
    m_serialPort->setParity(QSerialPort::NoParity);
    //设置一个停止位。
    m_serialPort->setStopBits(QSerialPort::OneStop);


    //把串口的可读信号和槽函数连接
    connect(m_serialPort,SIGNAL(readyRead()),this,SLOT(slotReadData()));
}

void MainWindow::slotReadData()
{
    //读取串口接收到的所有数据并存储在 data 变量中。
    QString data = m_serialPort->readAll();
    if(flg == 1)
    {
        ui->textEdit->append(data);
    }
    if(flg == 2)
    {
        ui->textEdit_2->append(data);
    }
    if(flg == 3)
    {
        ui->textEdit_3->append(data);
    }
    if(flg == 4)
    {
        ui->textEdit_4->append(data);
    }
}

void MainWindow::slotSend(int data)
{
    //检查串口指针是否有效。
    if (m_serialPort)
    {
        //检查串口是否已打开，如果未打开则输出警告。
        if (!m_serialPort->isOpen())
            qWarning()<<"请打开一个串口";
        //创建一个 QByteArray 对象 sendBuf 用于存储要发送的数据。
        QByteArray sendBuf;
        // 将传入的整数数据添加到 sendBuf 中
        sendBuf.append(data);
        // 将 sendBuf 中的数据通过串口发送出去。
        m_serialPort->write(sendBuf);
    }
}

MainWindow::~MainWindow()
{
    delete ui;
}


//开启LED灯
void MainWindow::on_pushButton_clicked()
{
    slotSend(1);
}
//关闭LED灯
void MainWindow::on_pushButton_2_clicked()//排风扇关闭
{
    slotSend(2);
}
//开启警报
void MainWindow::on_pushButton_4_clicked()
{
    slotSend(3);
}
//关闭警报
void MainWindow::on_pushButton_3_clicked()
{
    slotSend(4);
}
//退出
void MainWindow::on_pushButton_5_clicked()
{
    slotCloseSerialPort();
    this->close();
}


void MainWindow::on_pushButton_6_clicked()
{
    slotSend(5);
}


void MainWindow::on_pushButton_7_clicked()
{
    slotSend(6);
}

void MainWindow::on_pushButton_8_clicked()
{
    slotSend(7);
    flg = 1;
}

void MainWindow::on_pushButton_9_clicked()
{
    slotSend(8);
     flg = 2;
}


void MainWindow::on_pushButton_10_clicked()
{
    slotSend(9);
     flg = 3;
}


void MainWindow::on_pushButton_11_clicked()
{
    slotSend(10);
     flg = 4;
}


void MainWindow::on_pushButton_12_clicked()
{
    slotSend(11);
}


void MainWindow::on_pushButton_13_clicked()
{
    slotSend(12);
}




void MainWindow::on_pushButton_14_clicked()
{
    slotSend(13);
}


void MainWindow::on_pushButton_15_clicked()
{
    slotSend(14);
}

